/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.ResultSet;
import java.util.List;
import java.util.UUID;
import persistencia.agente.Pedido;

/**
 *
 * @author Sebastian
 */
public abstract class IntermediarioPersistencia extends Intermediario {

    @Override
    protected List<Object> materializar(Criterio criterio) {
        String sql;
        ResultSet rs;
        if (criterio != null) {
            sql = generarSQLBuscarConCriterio(criterio);
        } else {
            sql = generarSQLBuscarTodo();
        }
        rs = ejecutarConcultaSQL(sql);
        return convertirAObjeto(rs);
    }

//    @Override
//    public List<Object> buscar() {
//        String sql;
//        ResultSet rs;
//
//        sql = generarSQLBuscarTodo();
//        rs = ejecutarConcultaSQL(sql);
//        return convertirAObjeto(rs);
//    }
    @Override
    protected Object materializarXOid(String oid) {
        String sql;
        ResultSet rs;
        List<Object> resultado;
        sql = generarSQLBuscarXOid(oid);
        rs = ejecutarConcultaSQL(sql);

        resultado = convertirAObjeto(rs);
        if (resultado.isEmpty()) {
            return null;
        } else {
            return resultado.get(0);
        }

    }

    @Override
    protected void desmaterializar(Object objeto) {
        String sql;
        boolean resul;
//        if (((Agente) objeto).isNuevo()) {
            sql = generarSQLGuardar(objeto);
//        } else {
//            sql = generarSQLActualizar(objeto);
//        }
        resul = ejecutarSQLABM(sql);
        
        if (objeto instanceof Pedido) {
            System.out.println("desmaterialización anidada de Pedido");
            guardarObjetosCompuestos(objeto);
        }
    }

    @Override
    public boolean actualizar(Object objeto) {
        String sql;
        sql = generarSQLActualizar(objeto);
        return ejecutarSQLABM(sql);
    }

    @Override
    public boolean eliminar(Object objeto) {
        String sql;
        sql = generarSQLActualizar(objeto);
        return ejecutarSQLABM(sql);
    }

    //--- Métodos abstractos y/o no públicos
    protected abstract String generarSQLBuscarConCriterio(Criterio criterio);

    protected abstract String generarSQLBuscarTodo();

    protected abstract String generarSQLBuscarXOid(String oid);

    protected abstract String generarSQLGuardar(Object objeto);

    protected abstract String generarSQLActualizar(Object objeto);

    protected abstract String generarSQLEliminar(Object objeto);

    protected abstract List<Object> convertirAObjeto(ResultSet result);

    private ResultSet ejecutarConcultaSQL(String sql) {
        return ExpertoPersistencia.getInstancia().ejecutarConsulta(sql);
    }

    private boolean ejecutarSQLABM(String sql) {
        return ExpertoPersistencia.getInstancia().ejecutarSQLABM(sql);
    }

    private boolean ejecutarSQL(String sql) {
        return ExpertoPersistencia.getInstancia().ejecutarSQL(sql);
    }

    protected String generarOid() {
        return UUID.randomUUID().toString();
    }

    protected int convertirBooleanAInt(boolean bol) {
        int valor;

        if (bol) {
            valor = 1;
        } else {
            valor = 0;
        }

        return valor;
    }

    protected boolean convertirIntABoolean(int nro) {
        boolean valor = false;


        if (nro == 0) {
            valor = false;
        } else {
            valor = true;
        }

        return valor;
    }

    protected abstract boolean guardarObjetosCompuestos(Object objeto);
}
